Bellman-Ford算法及其优化

本文介绍了Bellman-Ford算法,一种能处理含有负权重图的单源最短路径算法,以及其在处理负权重环的情况。接着详细讨论了SPFA算法,它是对Bellman-Ford的优化,通过使用队列和标记向量减少无效的松弛操作,通常具有更好的平均性能。在没有负权重环的情况下,SPFA的时间复杂度接近O(E+V)。然而,当存在负权重环时,最坏情况下的时间复杂度仍为O(VE)。
摘要由CSDN通过智能技术生成

与Dijkstra算法一样,我们定义一幅加权有向图的结构如下:

//带权有向图
struct EdgeWeightedDigraph
{
	size_t V; //顶点数
	size_t E; //边数
	map<int, forward_list<tuple<int, int, double>> adj; //改进后的邻接表,tuple存储的是边集
}

Bellman-Ford算法

在加权有向图的最短路径求解算法中,Dijkstra算法只能处理所有边的权值都是非负的图(是否有环不影响求解),而基于拓扑顺序的算法虽然能在线性时间内高效处理负权重图,但仅局限于无环图。为此还需要一个更为普遍的最短路径求解算法:能够处理负权重图,也能处理有环的情况。

Bellman-Ford算法是求含负权重图的单源最短路径的一种算法。其原理为连续进行松弛,对于含有V个顶点的加权有向图,在每次松弛时把每条边都更新一下,若在V-1次松弛后还能更新,则说明图中有负权重环,因此无法得出结果,否则就完成。

vector<int> Bellman-Ford(EdgeWeightedDigraph &g)
{
    vec
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值